/**
 * \file SUnite.h
 * \author Catalin BLAJ
 * \author Vincent JACQUEMIN
 * \date 18 Octobre 2013
 *
 * Fichier header SUnite.h pour le programme du Sudoku.
 */


#ifndef SUNITE_H
#define SUNITE_H

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>

#include "SCase.h"

/*----------------
|   STRUCTURE    |
----------------*/

/**
* \struct SUnite
* \brief Structure d'une unité de Sudoku.
*
* Ceci est la structure d'une unité (ligne, colonne, région) de Sudoku.
*/
typedef struct SUnite
{
    /** Entier représentant le type de Sudoku. */
	unsigned char type;
	/** indice de l'unité parmi les autres du même type dans la grille (il y a n^2 unités de même type par grille). */
	unsigned short indice;
	/** un tableau de pointeur de cases (une unité est un tableau de n^2 cases). */
    SCase** cases;

} SUnite;



/*-------------------
|     FONCTIONS     |
-------------------*/

/* INITIALISATION - TESTAMENT */

/**
 * \brief Initialiseur de SUnite.
 * \param type : Type de sudoku (donnée).
 * \return Renvoie un pointeur vers l'unité initialisée.
 *
 * Initialiseur de SUnite.
 */
SUnite* SU_initialiser(unsigned char type);

/**
 * \brief Testament de SUnite.
 * \param unite : Unité que l'on veut détruire (donnée-résultat).
 *
 *  Testament de SCase.
 */
void SU_testament(SUnite* unite);


/* ACCESSEURS */

/**
 * \brief Accesseur du type de Sudoku.
 * \param unite : Unité du Sudoku dont on veut connaitre le type (donnée).
 * \return Renvoie le type de Sudoku.
 *
 * Cette fonction permet d'accéder au type de Sudoku dont fait partie l'unité.
 */
unsigned char SU_getType(const SUnite* unite);

/**
 * \brief Accesseur de case dans l'unité.
 * \param unite : Unité où se trouve la case que l'on cherche (donnée).
 * \param indice : Indice de la case que l'on cherche (donnée-résultat).
 *
 * Cette fonction permet de renvoyer le pointeur d'une case se trouvant dans l'unité.
 */
SCase* SU_getCase(const SUnite* unite, unsigned short indice);


/* MUTATEURS */

/**
 * \brief Mutateur du tableau de cases de l'unité.
 * \param unite : Unité à modifier (donnée-résultat).
 * \param indice : Indice dans l'unité où l'on veut mettre la case (donnée).
 * \param nouvelleCase : La case que l'on souhaite mettre dans l'unité (donnée-résultat).
 *
 * Cette fonction permet d'ajouter une case à l'unité.
 */
void SU_setCase(SUnite* unite, unsigned short indice, SCase* nouvelleCase);

#endif
